<?php
//引入所需文件
require_once('class/BCGFontFile.php');
require_once('class/BCGColor.php');
require_once('class/BCGDrawing.php');
require_once('class/BCGcode39.barcode.php');
require_once('./qrcode/phpqrcode.php');

/**
 * Class getqrbarImg
 * 把关于学生姓名和学号的数组
 *生成二维码保存到本地文件夹images
 * 并下载到客户端images.zip
 */
class getqrbarImg
{
    public $students;
    public $path; //文件生成的路径
    public function __construct($stdinfo,$path='./images')
    {
        $this->students = $stdinfo;
        $this->path = $path;
    }
    //生成条形码和二维码
    public function makeImg() {
        foreach ($this->students as $std) {
            $infos = array_values($std);
            //條形碼

            //黑白色
            $color_black = new BCGColor(0, 0, 0);
            $color_white = new BCGColor(255, 255, 255);
            //字体
            $font = new BCGFontFile('./font/Arial.ttf', 18);
            $drawException = null;

            //生成BCG39型的条形码
            try {
                $code = new BCGcode39();
                $code->setScale(2); // Resolution
                $code->setThickness(30); // Thickness
                $code->setForegroundColor($color_black); // Color of bars
                $code->setBackgroundColor($color_white); // Color of spaces
                $code->setFont($font); // Font (or 0)
                $code->parse($infos[1]); // Text
            } catch(Exception $exception) {
                if ($exception) {
                    return false;
                }
            }
            //创建文件夹
            if (! file_exists($this->path.'/barcode/')) {
                mkdir($this->path.'/barcode/',0777,true);
            }
            /*
             * 第一个参数为路径。默认为false，不保存为文件,输出到屏幕
             * 第二个参数为底色
             * */
            $drawing = new BCGDrawing($this->path.'/barcode/'.iconv("UTF-8","GBK",$infos[0]).'.png', $color_white);
            $drawing->setBarcode($code);
            $drawing->draw();
            //保存图片为PNG类型
            try {
                $drawing->finish(BCGDrawing::IMG_FORMAT_PNG);
            } catch (Exception $exception) {
                if ($exception) {
                    return false;
                }
            }

            if (! file_exists($this->path.'/qrcode/')) {
                mkdir($this->path.'/qrcode/',0777,true);
            }

            //二維碼
            /*
             * 第一个参数为二维码内容
             * 第二个参数为路径，没有就直接输出到浏览器
             * 第三个参数为容错率，默认为L，后面是M,Q,H,越高表示二维码能被覆盖区域的百分比
             * 第四个参数表示图片大小，默认为3
             * 第五个参数表示margin值，即二维码周围的白框大小
             * 最后一个表示是否保存到文件，默认为false*/
            QRcode::png($infos[1], $this->path.'/qrcode/'.iconv("UTF-8","GBK",$infos[0]).'.png',QR_ECLEVEL_L,4,2,true);

            //头像图
            $iconSource = $infos[2];
            $iconType = pathinfo($infos[2],PATHINFO_EXTENSION);
            $iconPath =$this->path.'/icon/';
            if (! file_exists($iconPath)) {
                mkdir($iconPath,0777,true);
            }

            $copy = copy($iconSource,$iconPath.$infos[0].".".$iconType);
            if(!$copy) {
                return false;
            }
        }
    }

    //利用PHP ZipArchive压缩扩展 压缩文件
    public function addFileToZip($path,$zip){
        $handler=opendir($path); //打开当前文件夹由$path指定。
        while(($filename=readdir($handler))!==false){
            if ($filename != "." && $filename != "..") {
                if (is_dir($path.'/'.$filename)) {
                    $this->addFileToZip($path."/".$filename,$zip);
                } else {
                    $zip->addFile($path."/".$filename);
                }
            }
        }
        @closedir($path);
    }

    //压缩并用header()输出到客户端
    public function downLoadFile() {
        $zip=new ZipArchive();
        if(! file_exists('./images.zip') ) {
            fopen('./images.zip',"w+");
        }
        if($zip->open('./images.zip', ZipArchive::OVERWRITE)=== TRUE){
            $this->addFileToZip('./images', $zip); //调用方法，对要打包的根目录进行操作，并将ZipArchive的对象传递给方法

        }
        $zip->close(); //关闭处理的zip文件

        //输出到客户端
        header('Content-Type: application/octet-stream');
        header('Content-Disposition: attachment; filename="images.zip"');
        header('Content-Transfer-Encoding: binary');
        readfile('./images.zip');
    }
    //删除服务器上文件夹下图片
    public function delImg($path) {
        $dh = opendir($path);

        while ($file= readdir($dh)) {
            if ($file!= '.' && $file!= '..') {
                $fullpath = $path."/".$file;
                if (!is_dir($fullpath)) {
                    unlink($fullpath);
                } else {
                    $this->delImg($fullpath);
                }
            }
        }
        rmdir($path);
    }
    //自动执行
    public function doAll(){
        $this->makeImg();
        $this->downLoadFile();
        $this->delImg($this->path);
        unlink('./images.zip');
    }

}

/*-----测试--v1.0-----*/
/*$arr = array(
    ['sjk' => '512019260'],
    ['ouwer' => '512019262']
);

$action = new getqrbarImg($arr);
$action->doAll();*/

/*--------测试v2.0-----*/

$arr = array(
    [
        'name' => '几十块',
        'number' => '1251019260',
        'icon' => './exampleicon/example001.jpeg'
    ],
    [
        'name' => '特价款',
        'numbr' => '1251019222',
        'icon' => './exampleicon/example002.jpeg'
    ]
);
$action = new getqrbarImg($arr);
$action->doAll();
